A communication network includes multiple interconnected devices. Typically, these interconnected devices send messages in data units. For example, a network such as the Internet uses data units called “packets.” A number of protocols may be used to control the flow of packets over a network or on the Internet. One protocol that controls the flow of packets over a network or on the Internet is the Transmission Control Protocol/Internet Protocol (TCP/IP).
TCP/IP is a connection-oriented reliable end-to-end protocol. That is, the TCP/IP protocol is used to establish and maintain reliable connections between applications on a packet-switched computer network and interconnected systems of such networks. For the delivery of information to be reliable, the packets must be sent and received in sequence by the applications using TCP/IP for communication. [RFC 783]
A network application may embed tags in packets. A tag is a bit or a sequence of bits within a packet that indicates certain characteristics of the packet. There are many possible ways to tag a packet. For example, the IP Type-of-Service (TOS) field is commonly used to tag IP packets. This four-bit sequence has the following standardized values [RFC 1389]:
1000 Minimize delay
0100 Maximize throughput
0010 Maximize reliability
0001 Minimize monetary cost
0000 Normal service
In previous implementations of tagging, the packets in a TCP/IP connection, if tagging was used, were commonly tagged with a constant value over the entire connection. Examples of packet tags that are constant include a tag that indicates that this is a high priority connection, or a tag that indicates that this connection should not be distributed among multiple application servers. For example, when TOS is used to tag TCP/IP packets, typically, all of the packets in a TCP connection share the same TOS value. One of the most frequent uses of TOS is as a tag that indicates the priority of the packet.
Tagged packets in TCP/IP convey information about the packet that can be used to determine the significance of the packet. This significance can be enforced by the application of network traffic control policies to that packet. A network traffic control policy, or “policy,” controls the handling of the packet and the TCP/IP connection to which it belongs. Examples of policies include priority queueing and TCP rate control; the former is commonly known, and the latter is disclosed in the prior art.
When packet tags do not vary over the course of the connection, any policy that is applied to a connection based on the initial packet tag value functions appropriately over the course of the connection.
A more recent introduction is the implementation of tags that vary from packet to packet over the course of the connection. Examples of packet tags that vary include a single bit that indicates the priority of the packet or multiple bits that indicate the type of information that the packet contains. For example, in Citrix MetaFrame 1.8 with Feature Release 1, or in Citrix MetaFrame XP, each packet is tagged with information that indicates information about the ICA Virtual Channel to which the packet belongs. As there are many virtual channels in use over the course of a Citrix ICA connection, the tags vary significantly over the course of a flow.
When packet tags vary over the course of a connection, a simple interpretation of such tags may not have the desired effect with regards to the traffic connection. That is, a policy applied to a connection based on the initial packet tag value does not function appropriately over the course of the connection, because the tags and the significance of the packets vary. For example, a packet with a tag that indicates that it is urgent may be significantly delayed because the initial packet of the connection indicated that this was an unimportant connection, and the policy that was applied to the connection assigned the connection a low priority.
An additional problem is inherent in applying a policy to each tagged packet within the connection. For example, when configuring a queuing policy that creates a priority queue for each packet tag, each packet is placed in a queue according to its tag, and transmitted in the order of relative importance to the other packets in the connection. However, TCP/IP is a connection-oriented reliable end-to-end protocol, and relies on sequential delivery of packets. Because TCP/IP guarantees in-order delivery to the application, this adds significant latency to the connection. That is, if a high priority packet follows a low priority packet while there is network congestion, the high-priority packet arrives potentially long before the lower-priority preceding packet. Because the high priority packet is received out of sequence, the TCP/IP stack on the receiving side retains the high priority packet, waits to receive the low priority packet, and, if the low priority packet is not received, requests retransmission of the unreceived low priority packet. The recipient then waits again for the low priority packet and may request a retransmission again if the packet is not received. Meanwhile, the high priority packet may time out, and the recipient may need to request the high priority packet again. The result is that the throughput of the connection is severely degraded as the connection is dominated by TCP/IP retransmit timeouts, and bandwidth is wasted as the high priority packets are subsequently resent. Because of this throughput degradation, there is no value to sending the later higher priority packet prior to the preceding lower-priority packet.
Thus, what is needed is a flexible way to control traffic flow such that packets with differing packet tags within the same connection are handled in a varying but controllable manner.